package org.sean.framework.util;

import org.sean.framework.logging.Logger;

import javax.validation.constraints.NotNull;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by Sean.xie on 2016/12/30.
 */
public class FileUtil {
    private static final Logger LOGGER = Logger.newInstance(FileUtil.class);

    private FileUtil() {
    }

    /**
     * 获取当前文件夹, 不管是否在jar包中都会返回文件夹的路径
     *
     * @return 当前文件夹路径
     */
    public static String getCurrentDir() {
        String currentDir = null;
        File file = new File(FileUtil.class.getProtectionDomain().getCodeSource().getLocation().getPath());
        if (file.isFile()) {
            currentDir = file.getParentFile().getAbsolutePath();
        } else {
            currentDir = file.getAbsolutePath();
        }
        return currentDir;
    }


    /**
     * @param filePath 文件路径
     * @return 判断文件是否存在
     */
    public static boolean isFileExist(String filePath) {
        File file = new File(filePath);
        return file.exists();
    }

    /**
     * 以文本形式读取文件内容
     *
     * @param file 文件路径
     * @return 文件数据
     */
    public static List<String> loadTextFile(String file) {
        List<String> result = null;
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(file));
            String tempString = null;
            result = new ArrayList<>();
            while ((tempString = reader.readLine()) != null) {
                result.add(tempString.trim());
            }
        } catch (Exception e) {
            LOGGER.printStackTrace(e);
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (Exception e) {
                LOGGER.printStackTrace(e);
            }
        }

        return result;
    }

    /**
     * 读取文件文本
     *
     * @param file 文件路径
     * @return 文件数据
     */
    public static String loadFileText(String file) {
        try {
            return loadFileText(file, "UTF-8");
        } catch (Exception e) {
            LOGGER.printStackTrace(e);
        }
        return null;
    }

    /**
     * 读取文本文件
     *
     * @param file    文件路径
     * @param charSet 字符编码
     * @return 文件数据
     * @throws UnsupportedEncodingException 异常
     */
    public static String loadFileText(String file, String charSet) throws UnsupportedEncodingException {
        byte[] bytes = loadFile(file);
        if (ObjectUtil.isEmpty(bytes)) {
            return null;
        }
        return new String(bytes, charSet);
    }

    /**
     * 以二进制形式读文件
     *
     * @param file 文件
     * @return 文件数据
     */
    public static @NotNull byte[] loadFile(String file) {

        try (
                FileInputStream fis = new FileInputStream(file);
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ) {
            int len = -1;
            byte[] bytes = new byte[1024 * 8];
            while ((len = fis.read(bytes)) != -1) {
                bos.write(bytes, 0, len);
            }
            return bos.toByteArray();

        } catch (IOException e) {
            LOGGER.printStackTrace(e);
            return new byte[0];
        }

    }

    /**
     * 获取文件名
     *
     * @param url 路径
     * @return 文件名
     */
    public static String getFileNameFromUrl(String url) {
        if (StringUtil.isEmpty(url)) {
            return "";
        }
        int index = url.lastIndexOf("/");
        if (-1 != index && index != url.length() - 1) {
            return url.substring(index + 1);
        } else {
            return url;
        }
    }

}
